/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package energiebedrijf.Classes;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Een klasse om aansluitingen mee op te halen en op te slaan
 * @author Robert
 */
public class ManagerAansluiting {
    private ArrayList<Water> WaterLijst = new ArrayList<Water>();
    private ArrayList<Gas> GasLijst = new ArrayList<Gas>();
    private ArrayList<Electriciteit> ElecLijst = new ArrayList<Electriciteit>();
       
    /**
     * Lege constructor
     */
    public ManagerAansluiting () {
    }

    /**
     * Geeft het Water aansluiting object terug voor het gevraagde perceel id
     * @param PerceelId Het perceel id
     * @return Een water object of null
     */
    public Water GetWaterAansluiting(int PerceelId) {
        for (Water w : this.getWaterLijst()) {
            if (w.getPerceel_Id() == PerceelId) {
                return w;
            }
        }
        
        return null;
    }
    
    /**
     * Geeft het Gas object terug voor het gevraagde perceel id
     * @param PerceelId Het perceel id
     * @return Een gas object of null
     */
    public Gas GetGasAansluiting(int PerceelId) {
        for (Gas g : this.getGasLijst()) {
            if (g.getPerceel_Id() == PerceelId) {
                return g;
            }
        }
        return null;
    }
    
    /**
     * Geeft het Electriciteit object terug voor het gevraagde perceel id
     * @param PerceelId Het perceel id
     * @return Een electriciteit object of null
     */
    public Electriciteit GetElectraAansluiting(int PerceelId) {
        for (Electriciteit e : this.getElecLijst()) {
            if (e.getPerceel_Id() == PerceelId) {
                return e;
            }
        }
        return null;
    }
    
    /**
     * Slaat alle aansluitingen op
     * @return True als het gelukt is, anders false
     */
    public boolean saveAll() {
        //Initialiseer de database connectie
        DatabaseConn objCn = new DatabaseConn();
        Connection con = objCn.GetDatabaseConnection();
        
        // Loop alle aansluitingen af en bewaar wijzigingen en voeg nieuwe aansluiting toe.
        for (Water w : this.getWaterLijst()) {
            try {
                PreparedStatement cmd = null;
                // Als aansluiting al in db zat, voer dan een update uit, anders een insert.
                if (w.getId() == -1) {
                    cmd = con.prepareStatement("INSERT INTO water (perceel_id, ingangsdatum) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS);
                    cmd.setInt(1, w.getPerceel_Id());
                    cmd.setDate(2, (java.sql.Date)w.getIngangsdatum());
                } else if (w.isIsChanged()) {
                    cmd = con.prepareStatement("UPDATE water SET ingangsdatum=?, vorigemeterstand=?, verbruik=? WHERE water_id =?;");
                    cmd.setDate(1, (java.sql.Date)w.getIngangsdatum());
                    cmd.setInt(2, w.getVorigeMeterstand());
                    cmd.setInt(3, w.getVerbruik());
                    cmd.setInt(4, w.getId());
                }
                
                if (cmd != null) {
                    cmd.executeUpdate();
                    con.commit();

                    //Als het een nieuw record is haal dan het id op
                    if (w.getId() == -1) {
                        Statement cmdId = con.createStatement();
                        ResultSet rs = cmdId.executeQuery("SELECT MAX(water_id) FROM water");
                        w.setId(rs.getInt(0));
                    }
                }
                
            } catch (SQLException ex) {
                ex.printStackTrace();
                return false;
            }
        }
        
        for (Gas g : this.getGasLijst()) {
            try {
                PreparedStatement cmd = null;
                // Als aansluiting al in db zat, voer dan een update uit, anders een insert.
                if (g.getId() == -1) {
                    cmd = con.prepareStatement("INSERT INTO gas (perceel_id, ingangsdatum) VALUES (?, ?)");
                    cmd.setInt(1, g.getPerceel_Id());
                    cmd.setDate(2, (java.sql.Date)g.getIngangsdatum());
                } else if (g.isIsChanged()) {
                    cmd = con.prepareStatement("UPDATE gas SET ingangsdatum=?, vorigemeterstand=?, verbruik=? WHERE gas_id =?;");
                    cmd.setDate(1, (java.sql.Date) g.getIngangsdatum());
                    cmd.setInt(2, g.getVorigeMeterstand());
                    cmd.setInt(3, g.getVerbruik());
                    cmd.setInt(4, g.getId());
                }
                
                if (cmd != null) {
                    cmd.executeUpdate();
                    con.commit();

                    //Als het een nieuw record is haal dan het id op
                    if (g.getId() == -1) {
                        Statement cmdId = con.createStatement();
                        ResultSet rs = cmdId.executeQuery("SELECT MAX(gas_id) FROM gas");
                        g.setId(rs.getInt(0));
                    }
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
                return false;
            }
        }
        
        for (Electriciteit e : this.getElecLijst()) {
            try {
                PreparedStatement cmd = null;
                // Als aansluiting al in db zat, voer dan een update uit, anders een insert.
                if (e.getId() == -1) {
                    cmd = con.prepareStatement("INSERT INTO electriciteit (perceel_id, ingangsdatum) VALUES (?, ?)");
                    cmd.setInt(1, e.getPerceel_Id());
                    cmd.setDate(2, (java.sql.Date)e.getIngangsdatum());
                } else {
                    cmd = con.prepareStatement("UPDATE electriciteit SET ingangsdatum=?, vorigemeterstand=?, verbruik=?, vorigemeterstandnacht=?, verbruiknacht=? WHERE electriciteit_id=?;", Statement.RETURN_GENERATED_KEYS);
                    cmd.setDate(1, (java.sql.Date) e.getIngangsdatum());
                    cmd.setInt(2, e.getVorigeMeterstand());
                    cmd.setInt(3, e.getVerbruik());
                    cmd.setInt(4, e.getVorigeMeterstandNacht());
                    cmd.setInt(5, e.getVerbruikNacht());
                    cmd.setInt(4, e.getId());
                }
                
                if (cmd != null) {
                    //Voer query uit
                    cmd.executeUpdate();
                    con.commit();

                    //Als het een nieuw record is haal dan het id op
                    if (e.getId() == -1) {
                        Statement cmdId = con.createStatement();
                        ResultSet rs = cmdId.executeQuery("SELECT MAX(electriciteit_id) FROM electriciteit");
                        e.setId(rs.getInt(0));
                    }
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
                return false;
            }
        }
        
        try {
            con.commit();
            con.close();
            objCn = null;
        } catch (SQLException ex) {
            System.out.println("Fout" + ex.getMessage());
        }

        return true;
    }
    
    /**
     * Haalt alle aansluiting op uit de database
     */
    public void GetAll() {
        ArrayList<Water> tmpWater = new ArrayList<Water>();
        ArrayList<Gas> tmpGas = new ArrayList<Gas>();
        ArrayList<Electriciteit> tmpElec = new ArrayList<Electriciteit>();
        
        try {
            //Initialiseer de database connectie
            DatabaseConn objCn = new DatabaseConn();
            Connection con = objCn.GetDatabaseConnection();
            
            DateFormat df = DateFormat.getDateInstance();
            Statement cmd = con.createStatement();
            ResultSet rs = cmd.executeQuery("SELECT * FROM water ORDER BY water_id");

            while (rs.next()) {
                Water w = new Water();
                
                w.setId(rs.getInt(1));
                w.setPerceel_Id(rs.getInt(2));
                try {
                    w.setIngangsdatum(df.parse(rs.getString(3)));
                } catch (ParseException ex) {
                    System.out.println("Fout: " + ex.getMessage());
                    w.setIngangsdatum(new Date());
                }
                w.setVerbruik(rs.getInt(4));
                w.setVorigeMeterstand(rs.getInt(5));     
                w.setIsChanged(false);
                tmpWater.add(w);
            }
            
            this.setWaterLijst(tmpWater);
            
            cmd = con.createStatement();
            rs = cmd.executeQuery("SELECT * FROM gas ORDER BY gas_id");

            while (rs.next()) {
                Gas g = new Gas();
                
                g.setId(rs.getInt(1));
                g.setPerceel_Id(rs.getInt(2));
                try {
                    g.setIngangsdatum(df.parse(rs.getString(3)));
                } catch (ParseException ex) {
                    System.out.println("Fout: " + ex.getMessage());
                    g.setIngangsdatum(new Date());
                }
                g.setVerbruik(rs.getInt(4));
                g.setVorigeMeterstand(rs.getInt(5));
                g.setIsChanged(false);
                tmpGas.add(g);
            }
            
            this.setGasLijst(tmpGas);
            
            cmd = con.createStatement();
            rs = cmd.executeQuery("SELECT * FROM electriciteit ORDER BY electriciteit_id");

            while (rs.next()) {
                Electriciteit e = new Electriciteit();
                
                e.setId(rs.getInt(1));
                e.setPerceel_Id(rs.getInt(2));
                try {
                    e.setIngangsdatum(df.parse(rs.getString(3)));
                } catch (ParseException ex) {
                    System.out.println("Fout: " + ex.getMessage());
                    e.setIngangsdatum(new Date());
                }
                e.setVerbruik(rs.getInt(4));
                e.setVorigeMeterstand(rs.getInt(5));             
                e.setVorigeMeterstandNacht(rs.getInt(6));
                e.setVerbruikNacht(rs.getInt(7));
                e.setIsChanged(false);
                tmpElec.add(e);
            }
            this.setElecLijst(tmpElec);
            
            con.close();
            objCn = null;
        } catch (SQLException ex) {
            Logger.getLogger(ManagerKlant.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

    /**
     * Geeft de lijst met water aansluitingen terug
     * @return De lijst met water aansluitingen
     */
    public ArrayList<Water> getWaterLijst() {
        return WaterLijst;
    }

    /**
     * Stelt de lijst met water aansluitingen in
     * @param WaterLijst
     */
    public void setWaterLijst(ArrayList<Water> WaterLijst) {
        this.WaterLijst = WaterLijst;
    }

    /**
     * Geeft de lijst met gas aansluitingen terug
     * @return De lijst met gas aansluitingen
     */
    public ArrayList<Gas> getGasLijst() {
        return GasLijst;
    }

    /**
     * Stelt de lijst met gas aansluitingen in
     * @param GasLijst
     */
    public void setGasLijst(ArrayList<Gas> GasLijst) {
        this.GasLijst = GasLijst;
    }

    /**
     * Geeft de lijst met electriciteits aansluitingen terug
     * @return De lijst met electra aansluitingen
     */
    public ArrayList<Electriciteit> getElecLijst() {
        return ElecLijst;
    }

    /**
     * Stelt de lijst met electriciteits aansluitngen in
     * @param ElecLijst
     */
    public void setElecLijst(ArrayList<Electriciteit> ElecLijst) {
        this.ElecLijst = ElecLijst;
    }
}

